package com.aletto.general_store.data;

import com.aletto.general_store.data.model.Address;
import com.aletto.general_store.data.model.AuctionGoods;
import com.aletto.general_store.data.model.AuctionPageGoods;
import com.aletto.general_store.data.model.ConsumerOrder;
import com.aletto.general_store.data.model.Goods;
import com.aletto.general_store.data.model.GoodsDetails;
import com.aletto.general_store.data.model.OrderCompany;
import com.aletto.general_store.data.model.OrderCreate;
import com.aletto.general_store.data.model.OrderDetails;
import com.aletto.general_store.data.model.OrderNumber;
import com.aletto.general_store.data.model.OrderScore;
import com.aletto.general_store.data.model.PageResponse;
import com.aletto.general_store.data.model.Response;
import com.aletto.general_store.data.model.SearchKeyword;
import com.aletto.general_store.data.model.ServiceOrder;
import com.aletto.general_store.data.model.Store;
import com.aletto.general_store.data.model.StoreFavorites;
import com.aletto.general_store.data.model.StoreOrder;
import com.aletto.general_store.data.model.Upload;
import com.aletto.general_store.data.model.UserDetails;
import com.sisyphus.spinach.core.model.IResponse;

import java.util.List;
import java.util.Map;

import io.reactivex.rxjava3.core.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import okhttp3.RequestBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Query;

public interface WebServiceApi {

    /**
     * 上传图片
     * <p>
     * 文件名称 file
     */
    @Multipart
    @POST("/upload")
    Observable<Response<String>> upload(@PartMap Map<String, RequestBody> files);

    @Multipart
    @POST("/upload")
    Observable<Response<Upload>> upload(@Part MultipartBody.Part file);

    // ------------------------------------ 无需登录 ------------------------------------

    /**
     * 首页数据
     */
    @GET("/getLists")
    Observable<Response<PageResponse<Goods>>> homeGoods(
            @Query("page") int page,
            @Query("size") int size,
            @Query("keyword") String keyword,
            @Query("type") Integer type,
            @Query("orderType") Integer orderType,
            @Query("shop_id") String shop_id
    );

    /**
     * 门店详情
     */
    @GET("/getShopDetails")
    Observable<Response<Store>> getShopDetails(@Query("id") String id, @Query("status") Integer status);

    /**
     * 商品详情
     */
    @GET("/getGoodsDetails")
    Observable<Response<GoodsDetails>> getGoodsDetails(@Query("id") String id, @Query("status") Integer status);

    /**
     * 热门搜索
     */
    @GET("/hotSearch")
    Observable<Response<SearchKeyword>> hotSearch();

    /**
     * 门店列表
     */
    @GET("/storeLists")
    Observable<Response<PageResponse<Store>>> storeLists(
            @Query("page") int page,
            @Query("size") int size,
            @Query("keyword") String keyword
//            @Query("type") int type,
//            @Query("orderType") int orderType
    );

    /**
     * 搜索提示
     */
    @GET("/searchPrompt")
    Observable<Response<List<SearchKeyword.HotSearch>>> searchPrompt(
            @Query("type") int type,
            @Query("keyword") String keyword
    );


    // ------------------------------------ 用户相关 ------------------------------------

    /**
     * 获取用户信息
     */
    @POST("/getUserInfos")
    Observable<Response<UserDetails>> getUserInfos();

    /**
     * 登录
     */
    @FormUrlEncoded
    @POST("/login")
    Observable<Response<UserDetails>> login(@Field("wallet_address") String address);

    /**
     * 修改用户信息
     */
    @FormUrlEncoded
    @POST("/upUserInfo")
    Observable<Response<Object>> upUserInfo(
            @Field("id") String id,
            @Field("name") String name,
            @Field("head_img") String head_img,
            @Field("sign") String sign
    );

    /**
     * 足迹
     */
    @GET("/myClickList")
    Observable<Response<PageResponse<Goods>>> myClickList(@Query("page") int page, @Query("size") int size);

    /**
     * 评分列表
     */
    @GET("/getGoodsScoreList")
    Observable<Response<PageResponse<OrderScore>>> getGoodsScoreList(
            @Query("goods_id") String goods_id,
            @Query("page") int page,
            @Query("size") int size
    );

    /**
     * 删除足迹
     *
     * @param id 访问ID（不传清空全部）
     */
    @GET("/delClickLog")
    Observable<Response<Object>> delClickLog(@Query("id") String id);

    /**
     * 用户地址
     */
    @POST("/addressList")
    Observable<Response<List<Address>>> addressList();

    /**
     * 添加收货地址
     */
    @FormUrlEncoded
    @POST("/addAddress")
    Observable<Response<Object>> addAddress(
            @Field("name") String name,
            @Field("phone") String phone,
            @Field("address") String address
    );

    /**
     * 删除地址
     */
    @FormUrlEncoded
    @POST("/delAddress")
    Observable<Response<Object>> deleteAddress(@Field("id") int id);

    /**
     * 设置为默认地址
     */
    @FormUrlEncoded
    @POST("/defaultAddress")
    Observable<Response<Object>> defaultAddress(@Field("id") int id);


    // ------------------------------------ 订单相关 ------------------------------------

    /**
     * 订单信息
     */
    @GET("/myOrderInfo")
    Observable<Response<OrderNumber>> myOrderInfo();

    /**
     * 订单详情
     */
    @FormUrlEncoded
    @POST("/getOrderDetails")
    Observable<Response<OrderDetails>> getOrderDetails(@Field("order_id") String id);


    /**
     * 我的订单
     * @param type 订单类型不传查全部，1待发货2待收货3评分4退款
     */
    @GET("/myOrderList")
    Observable<Response<PageResponse<ConsumerOrder>>> myOrderList(
            @Query("page") int page,
            @Query("size") int size,
            @Query("type") Integer type,
            @Query("keyword") String keyword
    );

    /**
     * 店铺订单
     * @param type 订单类型不传查全部，1待发货2待收货3评分4退款
     */
    @GET("/shopOrderList")
    Observable<Response<PageResponse<StoreOrder>>> shopOrderList(
            @Query("page") int page,
            @Query("size") int size,
            @Query("type") int type,
            @Query("keyword") String keyword
    );

    /**
     * 客服订单
     * @param type  6退货中 7退货成功 10拒绝退款
     */
    @FormUrlEncoded
    @POST("/kefuOrderList")
    Observable<Response<PageResponse<ServiceOrder>>> kefuOrderList(
            @Field("page") Integer page,
            @Field("size") Integer size,
            @Field("type") int type,
            @Field("keyword") String keyword
    );

    /**
     * 创建订单
     */
    @FormUrlEncoded
    @POST("/createOrder")
    Observable<Response<OrderCreate>> createOrder(
            @Field("goods_id") String goods_id,
            @Field("address_id") int address_id,
            @Field("num") int num
    );

    /**
     * 支付金额
     */
    @FormUrlEncoded
    @POST("/payOrder")
    Observable<Response<Object>> payOrder(
            @Field("order_id") Long order_id,
            @Field("pay_network") String pay_network,
            @Field("pay_hash") String pay_hash
    );

    /**
     * 发货
     *
     * @param send_id   物流单号,实物商品必填
     * @param send_code 物流公司编号,实物商品必填
     */
    @FormUrlEncoded
    @POST("/sendOrder")
    Observable<Response<Object>> sendOrder(
            @Field("order_id") Long order_id,
            @Field("send_id") String send_id,
            @Field("send_code") String send_code
    );

    /**
     * 获取物流公司列表
     */
    @GET("/logisticsList")
    Observable<Response<List<OrderCompany>>> logisticsList();

    /**
     * 确认收货
     */
    @FormUrlEncoded
    @POST("/confirmReceipt")
    Observable<Response<Object>> confirmReceipt(@Field("order_id") Long order_id);

    /**
     * 评论
     */
    @FormUrlEncoded
    @POST("/orderRating")
    Observable<Response<Object>> orderRating(@Field("order_id") Long order_id, @Field("score") Integer score);

    // ------------------------------------ 发布商品 ------------------------------------

    /**
     * 我的商品列表
     * @param status 商品状态1-草稿箱 2-已上架 3-下架
     */
    @FormUrlEncoded
    @POST("/myGoodsList")
    Observable<Response<AuctionPageGoods>> myGoodsList(
            @Field("page") int page,
            @Field("size") int size,
            @Field("status") Integer status,
            @Field("keyword") String keyword
    );

    /**
     * 发布商品
     */
    @FormUrlEncoded
    @POST("/addGoods")
    Observable<Response<Object>> addGoods(
            @Field("type") int type, // 1数字商品 2实物商品
            @Field("name") String name,
            @Field("goods_img") String goods_img, // 图片（逗号隔开）
            @Field("label") String label,
            @Field("desc") String desc, // 图片（逗号隔开）
            @Field("original_price") Float original_price,
            @Field("price") float price,
            @Field("total_stock") int total_stock,
            @Field("notice") String notice, // 备注
            @Field("status") int status // 商品状态1-草稿箱 2-已上架 3-下架
    );

    /**
     * 修改商品
     */
    @FormUrlEncoded
    @POST("/updateGoods")
    Observable<Response<Object>> updateGoods(
            @Field("id") String id,
            @Field("type") int type, // 1数字商品 2实物商品
            @Field("name") String name,
            @Field("goods_img") String goods_img, // 图片（逗号隔开）
            @Field("label") String label,
            @Field("desc") String desc, // 图片（逗号隔开）
            @Field("original_price") Float original_price,
            @Field("price") float price,
            @Field("total_stock") int total_stock,
            @Field("notice") String notice, // 备注
            @Field("status") int status // 商品状态1-草稿箱 2-已上架 3-下架
    );

    /**
     * 修改价格
     */
    @FormUrlEncoded
    @POST("/upGoodsPrice")
    Observable<Response<Object>> upGoodsPrice(@Field("id") String id, @Field("price") float price);

    /**
     * 修改库存
     */
    @FormUrlEncoded
    @POST("/upGoodsStock")
    Observable<Response<Object>> upGoodsStock(
            @Field("id") String id,
            @Field("stock_type") int stock_type, // 1加库存 2-减库存
            @Field("num") int num
    );

    // ------------------------------------ 其他 ------------------------------------

    /**
     * 收藏门店
     */
    @GET("/likeShop")
    Observable<Response<Object>> likeShop(@Query("id") String id, @Query("status") int status);

    /**
     * 收藏商品
     */
    @GET("/likeGoods")
    Observable<Response<Object>> likeGoods(@Query("id") String id, @Query("status") int status);

    /**
     * 收藏列表
     */
    @GET("/myLikeList")
    Observable<Response<PageResponse<Goods>>> favoritesGoodsList(
            @Query("page") int page,
            @Query("size") int size,
            @Query("type") int type
    );

    /**
     * 收藏列表
     */
    @GET("/myLikeList")
    Observable<Response<PageResponse<StoreFavorites>>> favoritesStoreList(
            @Query("page") int page,
            @Query("size") int size,
            @Query("type") int type
    );

    /**
     * 删除收藏
     */
    @GET("/delLikeLog")
    Observable<Response<Object>> delLikeLog(@Query("id") String id, @Query("type") int type);

    /**
     * 删除发布商品
     */
    @FormUrlEncoded
    @POST("/delGoods")
    Observable<Response<Object>> delGoods(@Field("id") String id);

    /**
     * 修改订单状态
     *
     * @param status 商品状态1-草稿箱 2-已上架 3-下架
     */
    @FormUrlEncoded
    @POST("/upGoodsStatus")
    Observable<Response<Object>> upGoodsStatus(@Field("id") String id, @Field("status") int status);

}
